﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.Codigo.CRM
{
    public static class Pipeline
    {
        #region SELECT

        public static DataTable Get_Pipeline1(UsuarioActivo _sesion, int Id_Moneda, int Id_Campana, int Id_GrupoClientes, int Id_Cliente, int Id_Colaborador, int Tiempo)
        {
            SIIE_ERP.BaseDatos.CRM.Transacciones.dbo_Trans_Oportunidad Trans_Oportunidad = new BaseDatos.CRM.Transacciones.dbo_Trans_Oportunidad(_sesion.RFC, _sesion.UserName);
            var dt_Oportunidades = Trans_Oportunidad.Get_Oportunidades_Pipeline(Id_Campana, Id_Cliente, Id_Colaborador, Tiempo).AsEnumerable();

            SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Moneda Cat_Moneda = new BaseDatos.Bancos.Catalogos.dbo_Cat_Moneda(_sesion.RFC, _sesion.UserName);
            var dt_Cat_Monedas = Cat_Moneda.Get_Monedas();
            
            DataTable dt = new DataTable();
            dt.Clear();

            dt.Columns.Add("D0");
            dt.Columns.Add("D20");
            dt.Columns.Add("D40");
            dt.Columns.Add("D60");
            dt.Columns.Add("D80");
            dt.Columns.Add("D90");
            dt.Columns.Add("D100");

            dt.Columns.Add("D0_M");
            dt.Columns.Add("D20_M");
            dt.Columns.Add("D40_M");
            dt.Columns.Add("D60_M");
            dt.Columns.Add("D80_M");
            dt.Columns.Add("D90_M");
            dt.Columns.Add("D100_M");

            DataRow _ravi = dt.NewRow();
            
            _ravi["D0"] = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 0 select d.Field<int>("Probabilidad")).Count().ToString();
            _ravi["D20"] = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 20 select d.Field<int>("Probabilidad")).Count().ToString();
            _ravi["D40"] = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 40 select d.Field<int>("Probabilidad")).Count().ToString();
            _ravi["D60"] = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 60 select d.Field<int>("Probabilidad")).Count().ToString();
            _ravi["D80"] = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 80 select d.Field<int>("Probabilidad")).Count().ToString();
            _ravi["D90"] = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 90 select d.Field<int>("Probabilidad")).Count().ToString();
            _ravi["D100"] = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 95 select d.Field<int>("Probabilidad")).Count().ToString();

            double D0_M = 0;
            double D20_M = 0;
            double D40_M = 0;
            double D60_M = 0;
            double D80_M = 0;
            double D90_M = 0;
            double D100_M = 0;

            double Aux = 0;
            double FMonedaToPesos = 0;
            double Monto = 0;

            foreach (DataRow m in dt_Cat_Monedas.Rows)
            {
                Aux = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 0 && d.Field<int>("Id_Moneda") == Int32.Parse(m["Id_Moneda"].ToString()) select d.Field<double>("IngresosEstimados")).Sum();                
                FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(m["Id_Moneda"].ToString()), Aux, _sesion);
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);
                D0_M += Monto;

                Aux = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 20 && d.Field<int>("Id_Moneda") == Int32.Parse(m["Id_Moneda"].ToString()) select d.Field<double>("IngresosEstimados")).Sum();
                FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(m["Id_Moneda"].ToString()), Aux, _sesion);
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);
                D20_M += Monto;

                Aux = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 40 && d.Field<int>("Id_Moneda") == Int32.Parse(m["Id_Moneda"].ToString()) select d.Field<double>("IngresosEstimados")).Sum();
                FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(m["Id_Moneda"].ToString()), Aux, _sesion);
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);
                D40_M += Monto;

                Aux = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 60 && d.Field<int>("Id_Moneda") == Int32.Parse(m["Id_Moneda"].ToString()) select d.Field<double>("IngresosEstimados")).Sum();
                FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(m["Id_Moneda"].ToString()), Aux, _sesion);
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);
                D60_M += Monto;

                Aux = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 80 && d.Field<int>("Id_Moneda") == Int32.Parse(m["Id_Moneda"].ToString()) select d.Field<double>("IngresosEstimados")).Sum();
                FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(m["Id_Moneda"].ToString()), Aux, _sesion);
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);
                D80_M += Monto;

                Aux = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 90 && d.Field<int>("Id_Moneda") == Int32.Parse(m["Id_Moneda"].ToString()) select d.Field<double>("IngresosEstimados")).Sum();
                FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(m["Id_Moneda"].ToString()), Aux, _sesion);
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);
                D90_M += Monto;

                Aux = (from d in dt_Oportunidades where d.Field<int>("Probabilidad") == 95 && d.Field<int>("Id_Moneda") == Int32.Parse(m["Id_Moneda"].ToString()) select d.Field<double>("IngresosEstimados")).Sum();
                FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(m["Id_Moneda"].ToString()), Aux, _sesion);
                Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);
                D100_M += Monto;
            }

            _ravi["D0_M"] = D0_M;
            _ravi["D20_M"] = D20_M;
            _ravi["D40_M"] = D40_M;
            _ravi["D60_M"] = D60_M;
            _ravi["D80_M"] = D80_M;
            _ravi["D90_M"] = D90_M;
            _ravi["D100_M"] = D100_M;

            dt.Rows.Add(_ravi);

            return dt;
        }

        public static DataTable Get_Pipeline2(UsuarioActivo _sesion, int Id_Moneda, int Id_Campana, int Id_GrupoClientes, int Id_Cliente, int Id_Colaborador, int Tiempo)
        {
            SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Moneda Cat_Moneda = new BaseDatos.Bancos.Catalogos.dbo_Cat_Moneda(_sesion.RFC, _sesion.UserName);

            SIIE_ERP.BaseDatos.CRM.Transacciones.dbo_Trans_Oportunidad Trans_Oportunidad = new BaseDatos.CRM.Transacciones.dbo_Trans_Oportunidad(_sesion.RFC, _sesion.UserName);
            SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets Tickets = new BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName);
            SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_Ventas MiDocumento_Ventas = new BaseDatos.Ventas.Transacciones.Documento_Ventas(_sesion.RFC, _sesion.UserName);
            SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasArrendamiento MiDocumento_VentasArrendamiento = new BaseDatos.Ventas.Transacciones.Documento_VentasArrendamiento(_sesion.RFC, _sesion.UserName);
            SIIE_ERP.BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios MiDocumento_VentasHonorarios = new BaseDatos.Ventas.Transacciones.Documento_VentasHonorarios(_sesion.RFC, _sesion.UserName);
            SIIE_ERP.BaseDatos.Configuracion.Empresa.dbo_Trans_Presupuesto_Venta Trans_Presupuesto_Venta = new BaseDatos.Configuracion.Empresa.dbo_Trans_Presupuesto_Venta(_sesion.RFC, _sesion.UserName);

            var dt_Oportunidades = Trans_Oportunidad.Get_Oportunidades_Pipeline(Id_Campana, Id_Cliente, Id_Colaborador, Tiempo);
            var dt_Facturas = MiDocumento_Ventas.Get_Documentos_Pipeline(BaseDatos.Documentos_Id.Doc_FacturaCliente, Id_Campana, Id_GrupoClientes, Id_Cliente, Id_Colaborador, Tiempo);
            var dt_Tickets = Tickets.Get_Tickets_NoFacturados();

            var dt_ReciboArrendamiento = MiDocumento_VentasArrendamiento.Get_Documento_Pipeline(Id_Campana, Id_GrupoClientes, Id_Cliente, Id_Colaborador, Tiempo);
            var dt_ReciboHonorarios = MiDocumento_VentasHonorarios.Get_Documento_Pipeline(Id_Campana, Id_GrupoClientes, Id_Cliente, Id_Colaborador, Tiempo);

            var dt_Remisiones = MiDocumento_Ventas.Get_Documentos_Pipeline(BaseDatos.Documentos_Id.Doc_Remision, Id_Campana, Id_GrupoClientes, Id_Cliente, Id_Colaborador, Tiempo);
            var dt_Presupuesto_Venta = Trans_Presupuesto_Venta.Get_Presupuesto_Ventas(Tiempo);

            double T_Oportunidades = 0;
            double T_Facturas = 0;
            double T_Tickets = 0;
            double T_ReciboArrendamiento = 0;
            double T_ReciboHonorarios = 0;
            double T_Remisiones = 0;
            double T_Presupuesto_Venta = 0;

            for (int i = 0; i < dt_Oportunidades.Rows.Count; i++)
            {
                double FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(dt_Oportunidades.Rows[i]["Id_Moneda"].ToString()), Double.Parse(dt_Oportunidades.Rows[i]["IngresosEstimados"].ToString()), _sesion);
                double Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);

                T_Oportunidades += Monto;
            }

            for (int i = 0; i < dt_Tickets.Rows.Count; i++)
            {
                double FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(dt_Tickets.Rows[i]["Id_Moneda"].ToString()), Double.Parse(dt_Tickets.Rows[i]["Total"].ToString()), _sesion);
                double Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);

                T_Tickets += Monto;
            }

            for (int i = 0; i < dt_Facturas.Rows.Count; i++)
            {
                double FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(dt_Facturas.Rows[i]["Id_Moneda"].ToString()), Double.Parse(dt_Facturas.Rows[i]["Total"].ToString()), _sesion);
                double Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);

                T_Facturas += Monto;
            }

            for (int i = 0; i < dt_ReciboArrendamiento.Rows.Count; i++)
            {
                double FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(dt_ReciboArrendamiento.Rows[i]["Id_Moneda"].ToString()), Double.Parse(dt_ReciboArrendamiento.Rows[i]["Total"].ToString()), _sesion);
                double Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);

                T_ReciboArrendamiento += Monto;
            }

            for (int i = 0; i < dt_ReciboHonorarios.Rows.Count; i++)
            {
                double FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(dt_ReciboHonorarios.Rows[i]["Id_Moneda"].ToString()), Double.Parse(dt_ReciboHonorarios.Rows[i]["Total"].ToString()), _sesion);
                double Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);

                T_ReciboHonorarios += Monto;
            }

            for (int i = 0; i < dt_Remisiones.Rows.Count; i++)
            {
                double FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(dt_Remisiones.Rows[i]["Id_Moneda"].ToString()), Double.Parse(dt_Remisiones.Rows[i]["Total"].ToString()), _sesion);
                double Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);

                T_Remisiones += Monto;
            }

            if (dt_Presupuesto_Venta.Rows.Count > 0)
            {
                int MesActual = DateTime.Now.Month;

                if (Tiempo == 1)
                {
                    if (MesActual == 1)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M1"].ToString());
                    else if (MesActual == 2)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M2"].ToString());
                    else if (MesActual == 3)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M3"].ToString());
                    else if (MesActual == 4)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M4"].ToString());
                    else if (MesActual == 5)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M5"].ToString());
                    else if (MesActual == 6)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M6"].ToString());
                    else if (MesActual == 7)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M7"].ToString());
                    else if (MesActual == 8)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M8"].ToString());
                    else if (MesActual == 9)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M9"].ToString());
                    else if (MesActual == 10)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M10"].ToString());
                    else if (MesActual == 11)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M11"].ToString());
                    else if (MesActual == 12)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M12"].ToString());
                }
                else if (Tiempo == 2)
                {
                    if (MesActual >= 1 && MesActual <= 3)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M1"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M2"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M3"].ToString());
                    else if (MesActual >= 4 && MesActual <= 6)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M4"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M5"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M6"].ToString());
                    else if (MesActual >= 7 && MesActual <= 9)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M7"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M8"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M9"].ToString());
                    else if (MesActual >= 10 && MesActual <= 12)
                        T_Presupuesto_Venta = Double.Parse(dt_Presupuesto_Venta.Rows[0]["M10"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M11"].ToString()) + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M12"].ToString());
                }
                else if (Tiempo == 3)
                {
                    if (MesActual >= 1 && MesActual <= 6)
                        T_Presupuesto_Venta =
                              Double.Parse(dt_Presupuesto_Venta.Rows[0]["M1"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M2"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M3"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M4"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M5"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M6"].ToString());
                    else if (MesActual >= 7 && MesActual <= 12)
                        T_Presupuesto_Venta =
                              Double.Parse(dt_Presupuesto_Venta.Rows[0]["M7"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M8"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M9"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M10"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M11"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M12"].ToString());
                }
                else if (Tiempo == 4 || Tiempo == 5)
                {
                    T_Presupuesto_Venta =
                              Double.Parse(dt_Presupuesto_Venta.Rows[0]["M1"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M2"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M3"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M4"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M5"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M6"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M7"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M8"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M9"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M10"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M11"].ToString())
                            + Double.Parse(dt_Presupuesto_Venta.Rows[0]["M12"].ToString());
                }

                double FMonedaToPesos = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromMonedaToPesos(Int32.Parse(dt_Presupuesto_Venta.Rows[0]["Id_Moneda"].ToString()), T_Presupuesto_Venta, _sesion);
                double Monto = SIIE_ERP.Codigo.Bancos.Catalogos.TipoDeCambioCode.FromPesosToMoneda(Id_Moneda, FMonedaToPesos, _sesion);

                T_Presupuesto_Venta = Monto;
            }

            DataTable dt = new DataTable();
            dt.Clear();
            dt.Columns.Add("Importe_Oportunidad");
            dt.Columns.Add("Importe_Vendido");
            dt.Columns.Add("Presupuesto_Venta");
            DataRow _ravi = dt.NewRow();
            _ravi["Importe_Oportunidad"] = Math.Round(T_Oportunidades, 2).ToString();
            _ravi["Importe_Vendido"] = (Math.Round(T_Facturas, 2) + Math.Round(T_Tickets, 2) + Math.Round(T_Remisiones, 2) + Math.Round(T_ReciboArrendamiento, 2) + Math.Round(T_ReciboHonorarios, 2)).ToString();
            _ravi["Presupuesto_Venta"] = Math.Round(T_Presupuesto_Venta, 2).ToString();
            dt.Rows.Add(_ravi);

            return dt;
        }

        #endregion
    }
}
